﻿using System;
using System.Windows.Forms;
using Logic;
using System.Threading;
using System.Drawing;
using System.Drawing.Imaging;


namespace SampleDB
{
    /// <summary>
    /// SampleDBクラス
    /// </summary>
    public partial class SampleDB : Form
    {
        int i;
        int j = 0;
        int count = 0;
        int[] dlcount;

        public SampleDB()
        {
            InitializeComponent();
        }

        #region イベント
        /// <summary>
        /// ロード時イベント
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void SampleDB_Load(object sender, EventArgs e)
        {

            SetGriddataOnThread();
            //// GridDataの設定
            //SetGridData();
        }

        /// <summary>
        /// 登録ボタン押下時処理
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnRegist_Click(object sender, EventArgs e)
        {
            SetBtnEnable(false);

            var logic = new SampleDBLogic();
            // データ登録をする
            //logic.Regist(colNumber.Index, txtshosekiname.Text, txttyosyaname.Text, txtshupanname.Text);

            SetRegistOnThread(1);

            // GridDataの再設定
            SetGriddataOnThread();

            // テキストをクリアする
            txtshosekiname.Text = String.Empty;
            txttyosyaname.Text = String.Empty;
            txtshupanname.Text = String.Empty;


        }

        #endregion

        #region private
        /// <summary>
        /// Gridにデータを設定する
        /// </summary>
        private void SetGridData()
        {


            var logic = new SampleDBLogic();
            // データを取得する
            var dataList = logic.GetData();

            BindingSource bs = new BindingSource();
            if (dataList != null && dataList.Count > 0)
            {
                foreach (var item in dataList)
                {
                    bs.Add(item);
                }
            }
            BindingGridData(bs);

            SetBtnEnable(true);
           
        }

        delegate void BindingGridDataDelegate(BindingSource bs);
        /// <summary>
        /// GridDataをバインドする
        /// </summary>
        /// <param name="bs"></param>
        private void BindingGridData(BindingSource bs)
        {


            // UIスレッド以外から呼ばれた場合
            if (InvokeRequired)
            {
                Invoke(new BindingGridDataDelegate(BindingGridData), bs);

                return;
            }

            gridData.DataSource = bs;


        }

        delegate void SetBtnEnableDelegate(bool enabled);

        private void SetBtnEnable(bool enabled)
        {

            // UIスレッド以外から呼ばれた場合
            if (InvokeRequired)
            {
                Invoke(new SetBtnEnableDelegate(SetBtnEnable), enabled);

                return;
            }

            btnRegist.Enabled = enabled;
            Delete_b.Enabled = enabled;
            btnUpdate.Enabled = enabled;
        }

        private void SetGriddataOnThread()
        {

            Thread t = new Thread(new ThreadStart(SetGridData));
            t.Start();
        }

        /// <summary>
        /// スレッドでDBに登録する
        /// <summary>
        delegate void SetRegistOnThreadDelegate(int flag);
        public void SetRegistOnThread(int flag)
        {
            // UIスレッド以外から呼ばれた場合
            if (InvokeRequired)
            {
                Invoke(new SetRegistOnThreadDelegate(SetRegistOnThread), flag);
                return;
            }
            var logic = new SampleDBLogic();
            if(flag == 1)
            {
                // データ登録をする
                logic.Regist(txtshosekiname.Text, txttyosyaname.Text, txtshupanname.Text);
            }
            else if (flag == 2)
            {
                for (i = 0; i < count; i++)
                {
                    // チェックしたデータを削除する
                    logic.Regist2(dlcount[i]);
                }
            }
            else if (flag == 3)
            {
                logic.Regist3(int.Parse(txtUpdate.Text),
                    txtshosekiname.Text, txttyosyaname.Text, txtshupanname.Text);
            }
        }

        #endregion


        private void Delete_b_Click(object sender, EventArgs e)
        {

            SetBtnEnable(false);

            // 行数取得
            foreach (DataGridViewRow row in gridData.Rows)
            {
                j++;
            }

            dlcount = new int[j];

            // 行の参照
            foreach (DataGridViewRow row in gridData.Rows)
            {
                // チェックボックス値取得
                foreach (DataGridViewCell cell in row.Cells)
                {
                    // チェックボックス判定
                    if (cell.ColumnIndex == 0)
                    {
                        // チェックボックスON/OFF判定
                        if (null != cell.Value
                            && cell.Value.Equals(true))
                        {
                            dlcount[count] = int.Parse(row.Cells["colID"].Value.ToString());
                            count++;
                        }
                    }
                }
            }

            //var logic = new SampleDBLogic();
            SetRegistOnThread(2);
            //for (i = 0; i < count; i++)
            //{
            //    // チェックしたデータを削除する
            //    logic.Regist2(dlcount[i]);
            //}
            // GridDataの再設定
            SetGriddataOnThread();

        }

        private void btnUpdate_Click(object sender, EventArgs e)
        {
            SetBtnEnable(false);

            var logic = new SampleDBLogic();
            // 指定IDを更新する
            if (txtUpdate.Text != "")
            {

                //logic.Regist3(int.Parse(txtUpdate.Text),
                //    txtshosekiname.Text, txttyosyaname.Text, txtshupanname.Text);

                SetRegistOnThread(3);

                // GridDataの再設定
                SetGriddataOnThread();

                // テキストをクリアする
                txtUpdate.Text = String.Empty;
                txtshosekiname.Text = String.Empty;
                txttyosyaname.Text = String.Empty;
                txtshupanname.Text = String.Empty;
            }

            
            else
            {
                MessageBox.Show("IDを指定して下さい。", "ERROR");
            }
        }

        private void gridData_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
        {
            //列ヘッダーかどうか調べる
            if (e.ColumnIndex == 0 && e.RowIndex >= 0)
            {
                //セルを描画する
                e.Paint(e.ClipBounds, DataGridViewPaintParts.All);
                //行番号を描画する範囲を決定する
                //e.AdvancedBorderStyleやe.CellStyle.Paddingは無視しています
                Rectangle indexRect = new Rectangle();
                indexRect = e.CellBounds;
                indexRect.Inflate(-2, -2);
                //行番号を描画する
                TextRenderer.DrawText(e.Graphics,
                    (e.RowIndex + 1).ToString(),
                    e.CellStyle.Font,
                    indexRect,
                    e.CellStyle.ForeColor,
                    TextFormatFlags.Right | TextFormatFlags.VerticalCenter);
                //描画が完了したことを知らせる
                e.Handled = true;
            }

        }
    }
}